{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Building_a_neural_network_using_PyTorch_on_a_toy_dataset.ipynb",
      "provenance": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.6"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/PacktPublishing/Modern-Computer-Vision-with-PyTorch/blob/master/Chapter02/Building_a_neural_network_using_PyTorch_on_a_toy_dataset.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:27.437450Z",
          "start_time": "2020-09-25T19:37:27.143217Z"
        },
        "id": "e1gtGb85daHv"
      },
      "source": [
        "import torch\n",
        "x = [[1,2],[3,4],[5,6],[7,8]]\n",
        "y = [[3],[7],[11],[15]]"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:27.440914Z",
          "start_time": "2020-09-25T19:37:27.438557Z"
        },
        "id": "ZaYGlxtQdbd1"
      },
      "source": [
        "X = torch.tensor(x).float()\n",
        "Y = torch.tensor(y).float()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:29.527549Z",
          "start_time": "2020-09-25T19:37:27.442428Z"
        },
        "id": "q5DT95H_dcwi"
      },
      "source": [
        "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n",
        "X = X.to(device)\n",
        "Y = Y.to(device)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:29.530750Z",
          "start_time": "2020-09-25T19:37:29.528696Z"
        },
        "id": "rHq7VwgDdeJ-"
      },
      "source": [
        "import torch.nn as nn"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:29.535567Z",
          "start_time": "2020-09-25T19:37:29.531890Z"
        },
        "id": "clpig_05dfYK"
      },
      "source": [
        "class MyNeuralNet(nn.Module):\n",
        "    def __init__(self):\n",
        "        super().__init__()\n",
        "        self.input_to_hidden_layer = nn.Linear(2,8)\n",
        "        self.hidden_layer_activation = nn.ReLU()\n",
        "        self.hidden_to_output_layer = nn.Linear(8,1)\n",
        "    def forward(self, x):\n",
        "        x = self.input_to_hidden_layer(x)\n",
        "        x = self.hidden_layer_activation(x)\n",
        "        x = self.hidden_to_output_layer(x)\n",
        "        return x"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:29.540168Z",
          "start_time": "2020-09-25T19:37:29.536723Z"
        },
        "id": "McmLsQstdnxr"
      },
      "source": [
        "mynet = MyNeuralNet().to(device)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:29.544857Z",
          "start_time": "2020-09-25T19:37:29.541272Z"
        },
        "id": "8cyG-B-AdoBB"
      },
      "source": [
        "loss_func = nn.MSELoss()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:29.554504Z",
          "start_time": "2020-09-25T19:37:29.546221Z"
        },
        "id": "QRTf8vdKdqmP",
        "outputId": "202d1e33-b0c3-4dcc-a760-c96bb5e94ea2",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "_Y = mynet(X)\n",
        "loss_value = loss_func(_Y,Y)\n",
        "print(loss_value)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "tensor(117.3367, device='cuda:0', grad_fn=<MseLossBackward>)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:29.558932Z",
          "start_time": "2020-09-25T19:37:29.555392Z"
        },
        "id": "dTOdsvFydsQK"
      },
      "source": [
        "from torch.optim import SGD\n",
        "opt = SGD(mynet.parameters(), lr = 0.001)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:29.588488Z",
          "start_time": "2020-09-25T19:37:29.560089Z"
        },
        "id": "xyHCZwfYduGO"
      },
      "source": [
        "loss_history = []\n",
        "for _ in range(50):\n",
        "    opt.zero_grad()\n",
        "    loss_value = loss_func(mynet(X),Y)\n",
        "    loss_value.backward()\n",
        "    opt.step()\n",
        "    loss_history.append(loss_value.item())"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2020-09-25T19:37:29.838987Z",
          "start_time": "2020-09-25T19:37:29.589467Z"
        },
        "id": "DiO6I53udwvY",
        "outputId": "5dd07791-cb79-4f27-d5c4-2c6b17e9f614",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 312
        }
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "plt.plot(loss_history)\n",
        "plt.title('Loss variation over increasing epochs')\n",
        "plt.xlabel('epochs')\n",
        "plt.ylabel('loss value')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Text(0, 0.5, 'loss value')"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 11
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jmfHZmKXdyND"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    }
  ]
}
